注意:所有文章除特别说明外,转载请注明出处.
Java集合框架 - ArrayList与源码分析
//ArrayList继承关系
java.lang.Object
↳ java.util.AbstractCollection<E>
↳ java.util.AbstractList<E>
↳ java.util.ArrayList<E>
public class ArrayList<E> extends AbstractList<E>
implements List<E>, RandomAccess, Cloneable, java.io.Serializable {}
ArrayList继承了AbstractList,实现了List。它是一个数组队列,相当于动态数组。提供了相关的添加、删除、修改和遍历等功能。
ArrayList
ArrayList实现了RandomAccess接口,即提供了随机访问功能。RandomAccess是java中用来被List实现,为List提供快速访问功能的。在ArrayList中,我们即可以通过元素的序号来快速获取元素对象,这就是快速随机访问。后面会比较List的“快速随机访问”和使用“Iterator迭代器访问”的效率。
ArrayList实现了Cloneable接口,即覆盖了函数clone(),能被克隆。
ArrayList实现了java.io.Serializable接口,这意味着ArrayList支持序列化,能通过序列化去传输。
注意:和Vector不同,ArrayList中的操作是非线程安全的。所以建议在单线程中使用ArrayList,在多线程中选择Vector或者CopyOnWriteArrayList。
提示:1. ArrayList是基于动态数组实现的,在增删时候,需要数组的拷贝复制。
- ArrayList的默认初始化容量是10,每次扩容时候增加原先容量的一半,也就是变为原来的1.5倍。
- 删除元素时不会减少容量,若希望减少容量则调用trimToSize()。
- 它不是线程安全的。它能存放null值。
ArrayList 与 Vector 区别
Vector底层也是数组,与ArrayList最大的区别就是:同步(线程安全)。
在要求非同步的情况下,我们一般都是使用ArrayList来替代Vector的。
如果想要ArrayList实现同步,可以使用Collections的方法:
List list = Collections.synchronizedList(new ArrayList(...));
就可以实现同步了。
还有另外的一个区别:ArrayList在底层数组不够用时在原来的基础上扩展0.5倍,Vector扩展1倍。
LinkedList 解析
LinkedList底层是双向链表,